package com.mxcyk.serviceLogic;

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import org.apache.log4j.Logger;

public final class Run {

	/**
	 * 功能：执行file文件 预留功能： 获得文件的后缀名根据后缀名判定是调用system内部执行还是使用MiniBox所带的App打开。
	 * Run类为单例模式
	 */
	private static final Run r = new Run();
	private Logger logger=Logger.getLogger(Run.class);
	public static Run getRun() {
		if (r == null)
			return new Run();
		return r;
	}

	private Run() {
		// run(new File("G:\\书箱\\性能监控.rtf"));
	}

	public int runSuffix(File file) {
		if (!file.exists()) {
			logger.debug("file not exist\n在Run类执行文件时打开的文件不存在！");
			return 1;
		}
		String suffix = file.getName();

		// 如果后缀名是.jar
		String name = (String) suffix.subSequence(suffix.lastIndexOf('.'),
				suffix.length());
		name = name.toLowerCase();

		if (name.equals(".jar")) {

		} else {
			int i = run(file);// 使用系统默认工具打开

			if (i == 1)
				logger.debug("使用系统默认工具打开出错");
		}

		return 0;
	}

	/**
	 * 功能：获取系统默认浏览器打开链接 使用方法：传入网址即可
	 * 
	 * @param url
	 *            需访问的网址 日期：2012-8-9
	 */
	public void runURI(java.net.URI url) {
		// 判断当前系统是否支持Java AWT Desktop扩展
		if (java.awt.Desktop.isDesktopSupported()) {
			try {
				// 创建一个URI实例
				// java.net.URI uri =
				// java.net.URI.create("http://www.163.com/");
				// 获取当前系统桌面扩展
				java.awt.Desktop dp = java.awt.Desktop.getDesktop();
				// 判断系统桌面是否支持要执行的功能
				if (dp.isSupported(java.awt.Desktop.Action.BROWSE)) {
					// 获取系统默认浏览器打开链接
					dp.browse(url);
				}
			} catch (java.lang.NullPointerException e) {
				// 此为uri为空时抛出异常
			} catch (java.io.IOException e) {
				// 此为无法获取系统默认浏览器
				logger.debug("Run类访问url无法获得默认游览器");
			}
		}
	}

	// 使用默认关联程序打开文件。
	public int run(File file) {

		// 如果是doc文件，则默认使用word等程序打开
		// File file ＝ new File（"d:\\1234.doc"）;
		if (!file.exists()) {
			logger.debug("file not exist\n在Run类执行文件时打开的文件不存在！");
			return 1;
		} else {

			logger.debug("文件所在路径嗯嗯" + file.getParent());

			try {
				Desktop desktop = Desktop.getDesktop();
				desktop.open(file);
			} catch (IOException e) {
				logger.debug("在Run类执行文件时出错");
				e.printStackTrace();
				return 1;
			}

		}
		return 0;
	}

	/**
	 * 功能：使用系统默认方式打开磁盘分区
	 * 
	 * @param path
	 */
	public void runOpen(File path) {
		try {
			java.awt.Desktop.getDesktop().open(path);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			logger.debug("Run类执行打开目录出错\n可能是因为没有此目录！");
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		new Run();
	}

}

/*
 * ==============================================================================
 * 下面是关于 Desktop。open的说明，使用 http：//api。java2000。net/open 可以快速找到你要的JDK的API说明
 * open public void open（File file） throws IOException启动关联应用程序来打开文件。
 * 如果指定的文件是一个目录，则启动当前平台的文件管理器打开它。
 *  参数： file － 考试大提示要用关联应用程序打开的文件 抛出：
 * NullPointerException － 如果 file 为 null IllegalArgumentException － 如果指定文件不存在
 * UnsupportedOperationException － 如果当前平台不支持 Desktop。Action。OPEN 动作 IOException
 * － 如果指定文件没有关联应用程序，或者关联应用程序无法启动 SecurityException － 如果安全管理器存在且其
 * SecurityManager。checkRead（java。lang。String） 方法拒绝对文件进行读取访问；或者它拒绝
 * AWTPermission（"showWindowWithoutWarningBanner"） 权限； 或者不允许调用线程创建子进程 另请参见：
 * AWTPermission
 */